package com.luff.thread;

import com.luff.thread.ThreadPool.MyThreadPoolExecutor;
import com.luff.thread.factory.MyThreadFactory;
import com.luff.thread.handler.MyRejectedHandler;
import com.luff.thread.task.MyTask;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.*;

/**
 * Create By The-Long time 2021/10/6 20:01
 **/

/**
 1.早上需要往线程池中添加1000吨水;
 2.中午休息，水池暂停放水;
 3.休息完毕，水池恢复放水;
 4.下午6点开始停水;
 5.10分钟后，检查水池状态，未放完启动强制停水。
 */

public class Main {

    public static void main(String[] args) throws InterruptedException, IOException{
        int corePoolSize = 2; //核心线程数
        int maximumPoolSize = 4; //最大线程数
        long keepAliveTime = 10;  //普通线程存活时间
        TimeUnit unit = TimeUnit.SECONDS;
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2); //阻塞队列
        ThreadFactory threadFactory = new MyThreadFactory(); //自定义线程工厂
        RejectedExecutionHandler handler = new MyRejectedHandler();

        /*构造线程池*/
        MyThreadPoolExecutor executor = new MyThreadPoolExecutor(1000,2,corePoolSize, maximumPoolSize, keepAliveTime, unit,
                workQueue, threadFactory, handler);

        executor.prestartAllCoreThreads(); // 预启动所有核心线程

        //定义4个任务,放入线程池
        for (int i = 1; i <= 10; i++) {
            MyTask task = new MyTask(String.valueOf("线程" + i));
            executor.execute(task);
        }
        Thread.sleep(1000);
        /**
         * 暂停放水中。。。
         * 中午啦，回家吃饭啦水池被暂停了。还剩852吨水
         * 暂停放水中。。。
         * 暂停放水中。。。
         * 暂停放水中。。。
         * 暂停放水中。。。
         */
        System.out.println("中午啦，回家吃饭啦水池被暂停了.还剩"+MyThreadPoolExecutor.water+"吨水");
        //调用暂停方法,让每个任务进入阻塞状态
        executor.pause();

        //主线程阻塞5s进入下午
        Thread.sleep(2000);

        executor.resume();
        System.out.println("下午啦开始放水啦!");
        //定义10个任务,放入线程池
        for (int i = 1; i <= 10; i++) {
            MyTask task = new MyTask(String.valueOf(i));
            executor.execute(task);
        }
        //调用恢复方法,任务进入就绪状态,等待线程池调度.

        Thread.sleep(200);
        /**
         * 下午5点啦开始停水啦!将在10秒后强制停水
         * 开始停水正常
         * 正在放水
         * 正在放水
         * 。。。
         * 正在放水
         * 正在放水
         * 启动强制停水！
         * 水池还剩618吨水
         */
        System.out.println("下午5点啦开始停水啦!将在10秒后强制停水");
        executor.shutdown();
        if(executor.isShutdown())
            System.out.println("开始停水正常");

        Thread.sleep(200);

        boolean b = executor.awaitTermination(200, TimeUnit.MILLISECONDS);
        if(!b){

            //说明还有未完成的任务
            System.out.println("启动强制停水！");
            //强制消亡线程
            executor.killAll();

            //防止java.lang.InterruptedException: sleep interrupted
            Thread.sleep(2000);
            List<Runnable> runnables = executor.shutdownNow();//获取阻塞队列中的任务
            runnables.clear();//清除阻塞队列
        }else{
            System.out.println("停水正常，水池没水了。");
        }
        System.out.println("水池还剩"+MyThreadPoolExecutor.water+"吨水");

        //阻塞主线程
        System.in.read();
    }
}
